/**
 * 描述: 通用方法
 * 版权: Copyright (c) 2019
 * 公司: 深圳市网商天下科技开发有限公司
 * 作者: 许堉颖
 * 版本: 1.0.0
 * 创建时间: 2019/5/7 10:21
 */

// 初始化
const cloud = require('wx-server-sdk')
cloud.init();

/**
 * 获取cloud
 * @param 
 */
function getCloud() {
  const { ENV } = cloud.getWXContext();
  console.log('===========云函数更新默认配置============');
  console.log(ENV);
  // 更新默认配置，将默认访问环境设为当前云函数所在环境
  cloud.updateConfig({
    env: ENV
  });
  
  return cloud;
}


/**
 * 链接数据库
 * @param 
 */
function getDatabase() {
  // 获取数据库链接
  return db = this.getCloud().database();
}

/**
 * 格式化返回值
 * @param promise 方法
 * @param count 集合数据总数
 * @param currentPage 当前页
 * @param totalPage 总页数
 */
function resultConstructor(promise, count, currentPage, totalPage) {
  return promise.then(
    // 执行成功时
    resolve => {
      // console.log('===resolve===');
      let resutl = {
        code: 0,
        data: {},
        errMsg: resolve.errMsg 
      };
      resutl['data']['list'] = resolve['data'];
      count && (resutl['data']['count'] = count);
      currentPage && (resutl['data']['currentPage'] = currentPage);
      totalPage && (resutl['data']['totalPage'] = totalPage);
      return resutl;
    },
    // 执行失败时
    reject => {
      // console.log('===reject===');
      reject.code = reject.errCode;
      return reject;
    }
  )
}

// 请求参数类
class RequestParams {
  constructor(params = {}) {
    // 参数校验是否通过
    this.IS_PARAMS_CHECK_PASS = true;
    // 参数校验失败消息
    this.PARAMS_ERROR_MSG = '';
    for (const key in params) {
      if (params.hasOwnProperty(key)) {
        this[key] = params[key];
      }
    }
  }

  /**
   * 设置参数
   * @param key 参数名
   * @param value 参数值
   * @param def 默认值
   * @param name 参数解释
   * @returns {{check: check, checkEmpty: (function(*=): void)}}
   */
  put(key, value = '', def = null, name = null) {
    if (this.isEmpty(value)) {
      if (def !== null) {
        this[key] = def;
      }
    } else {
      this[key] = value;
    }
    return {
      // 字符检查
      checkCode: (...args) => {
        if (args.indexOf('empty') > -1) {
          this.checkEmpty(name, key);
        }
        if (args.indexOf('special') > -1) {
          this.checkSpecial(name, key);
        }
      },
      checkEmpty: (name) => this.checkEmpty(name, key)
    }
  }

  // 检验空值
  checkEmpty(name, key) {
    if (this.isValEmpty(key) && this.IS_PARAMS_CHECK_PASS) {
      this.IS_PARAMS_CHECK_PASS = false;
      this.PARAMS_ERROR_MSG = `[${name}]不能为空!`;
    }
  }

  // 检验特殊字符
  checkSpecial(name, key) {
    const str = this[key];
    if (this.isValEmpty(key)) {
      return;
    }
    if (!new RegExp('^[\u4e00-\u9fa5a-z\\d]+$', 'gi').test(str)) {
      this.IS_PARAMS_CHECK_PASS = false;
      this.PARAMS_ERROR_MSG = `[${name}]只能包含数字、英文、汉字`;
    }
  }

  isEmpty(str) {
    return str === null || str === '' || str === undefined;
  }

  isValEmpty(key) {
    const str = this[key];
    return this.isEmpty(str);
  }

  checkParamsResult(request){
    // 存在不符合规范的参数时
    if (request['IS_PARAMS_CHECK_PASS'] === false) {
      return {
        status: false,
        data: {
          code: -198223,
          errMsg: request['PARAMS_ERROR_MSG'],
        }
      }
    }
    let params = {};
    // 校验成功时
    for (const key in request) {
      if (request.hasOwnProperty(key) && key !== 'IS_PARAMS_CHECK_PASS' && key !== 'PARAMS_ERROR_MSG') {
        params[key] = request[key];
      }
    }
    return {
      status: true,
      data: params,
      errMsg: '参数校验成功'
    }
  }
}


module.exports = {
  resultConstructor: resultConstructor,
  getCloud: getCloud,
  getDatabase: getDatabase,
  RequestParams: RequestParams
}